查看原文
其他

源码解析|Apache Doris源码阅读与解析系列第0讲——从零认识Doris代码库

百度Doris团队 ApacheDoris 2022-04-24







课 程 介 绍


亲爱的各位小伙伴们,大家期待已久的直播课程终于要跟大家见面了!


《 Apache Doris 源码阅读与解析》系列直播活动旨在帮助 Apache Doris 社区的开发者或者有意向参与 Apache Doris 社区建设的小伙伴们,可以更快熟悉 Apache Doris 代码的组织结构和一些主要流程的实现原理以及代码位置,以便于各位小伙伴们能够快速上手,参与到开发工作中来。


本系列直播课程暂定分为 10 次课程,涵盖了 Apache Doris 中大部分重点流程的讲解,包括建表语句执行、数据写入、SQL执行、数据读取、查询优化器以及元数据管理等。



课 程 正 文


本期课程《从零认识 Doris 代码库》为 Apache Doris 源码解析系列直播课程 的第 0 讲,作为导读文章来帮助开发者从整体角度了解 Apache Doris 的代码结构和开发流程,以便后续能够更快上手参与 Doris 的代码开发。


本文将从以下几个方面进行展开:
  • Doris 源码的获取及提交

  • Doris 开发环境的搭建

  • Doris 系统架构简述

  • Doris 代码目录结构说明

  • Doris 代码合入准则


01  Apache Doris 源码的获取及提交



这里我们直接参阅 Apache Doris 官网的 码提交指南 即可,链接:

http://doris.incubator.apache.org/master/zh-CN/community/pull-request.html


02  Apache Doris 开发环境搭建



Doris 的代码主要是语言为 Java 和 C++。其中 FE 模块主要由 Java 编写,而 BE 模块主要由 C++ 编写。这里我们分别就 FE 和 BE 的开发环境进行说明。


FE 开发环境

FE 中的 Java 代码由 Maven 进行管理。这里我们推荐使用 IntelliJ IDEA 进行开发,

IntelliJ IDEA 的开发环境搭建可以参阅 官方文档 ,链接:

http://doris.incubator.apache.org/master/zh-CN/developer-guide/fe-idea-dev.html

在工程创建完成后,建议配置 IDEA 的如下两个功能,以方便通过代码格式检查:

  • Editor -> Code Style -> Java 中配置 Imports Order。

    Imports Order 的具体顺序可参阅 官方文档 ,链接:

    http://doris.incubator.apache.org/master/zh-CN/developer-guide/java-format-code.html#import-order

  •  Save Actions 设置保存时自动格式化。

    建议在格式化选项中仅勾选 Optimize imports  Reformat only changed code。以保证 Import 顺序,以及不会自动格式化其他未变更的代码。


BE 开发环境

BE 开发环境请参阅 官方文档 ,链接:

http://doris.incubator.apache.org/master/zh-CN/developer-guide/be-vscode-dev.html

BE 的代码自动格式化请参阅 官网文档 ,链接:

http://doris.incubator.apache.org/master/zh-CN/developer-guide/cpp-format-code.html#

这里我们建议通过 Git hook 的方式在代码提交时自动格式化。可以按照如下步骤操作:
  • cd incubator-doris/.git/hooks

  • 创建文件  pre-commit 内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash

format_file() {
file="${1}"
if [ -f $file ]; then
clang-format -i -style=file ${1}
git add ${1}
fi
}

case "${1}" in
--about )
echo "Runs clang-format on source files"
;;
* )
for file in `git diff-index --cached --name-only HEAD | grep -iE '\.(cpp|cc|h|hpp)$' ` ; do
format_file "${file}"
done
;;
esac
  • 修改 pre-commit 文件权限: chmod +x pre-commit, 之后在 git commit 的时候就会自动格式化变更的代码了。

03  Apache Doris 系统架构简述



Apache Doris 系统架构

如上图,Doris 主要有两类进程:Frontend(FE) 和 Backend(BE) 。


Frontend

Frontend 以 Java 语言为主。主要有如下功能职责:
  • 接收用户连接请求(MySQL 协议层)
  • 元数据存储与管理
  • 查询语句的解析与查询计划的执行
  • 集群管控


Backend

Backend 以 C++ 语言为主。主要有如下功能职责:
  • 数据存储与管理

  • 查询计划的执行

本系列课程主要围绕这两个模块中的功能进行讲解。


04  Apache Doris 代码目录结构说明



这里我们从根目录说起,以 commit b3ae607f 为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
├── be // BE 代码目录
├── bin // FE/BE 的启停脚本
├── build_plugin.sh // FE 插件编译脚本
├── build.sh // Doris 编译脚本
├── build-support // 编译用辅助脚本
├── CODE_OF_CONDUCT.md // 贡献者代码行为准则
├── conf // FE/BE 的配置文件
├── contrib // 第三方贡献代码,如 udf
├── CONTRIBUTING_CN.md
├── CONTRIBUTING.md
├── DISCLAIMER
├── docker // Doris 开发镜像的 Dockerfile
├── docs // 文档目录
├── env.sh
├── extension // 扩展功能代码,如 flink connector 等
├── fe // FE 代码目录
├── fe_plugins // FE 插件目录
├── fs_brokers // Broker 代码目录
├── gensrc // thrift/protobuf 等代码生成目录
├── LICENSE.txt
├── NOTICE.txt
├── README.md
├── run-be-ut.sh // BE 单元测试运行脚本
├── run-fe-ut.sh // FE 单元测试运行脚本
├── samples // 示例代码目录
├── thirdparty // 第三方依赖库目录
├── tools // 一些辅助工具
├── tsan_suppressions
├── ui // FE 前端代码目录
└── webroot // 一些静态网页相关代码

这里我们主要介绍 fe/ be/ gensrc/ extension/ 四个目录。


FE

fe/

1
2
3
4
5
6
7
8
├── checkstyle-apache-header.txt
├── checkstyle.xml
├── conf
├── fe-common // 一些 FE 模块的通用代码
├── fe-core // FE 模块主代码
├── pom.xml
├── README
└── spark-dpp // Spark Load 所依赖的 Spark 导入程序代码

fe-core 为 FE 的核心代码模块

1
2
3
4
5
6
7
8
├── main
│ ├── cup // 语法定义文件
│ ├── java // 主代码
│ ├── jflex // 词法定义文件
│ └── resources
└── test // 单元测试
├── java
└── resources

在 main/java/org/apache/doris/ 下即是 FE 代码的主要部分了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
├── alter // 表结构变更操作相关的代码。包括表结构变更,物化视图等。
├── analysis // 包含所有SQL语法的java实例类
├── backup // 备份恢复操作相关的代码
├── blockrule // SQL 黑名单相关代码
├── catalog // 包含元数据操作的主类和各种数据库、表、分区的元数据实例类
├── clone // 数据副本修复和均衡相关的代码
├── cluster // 已废弃
├── common // 一些工具类和通用定义
├── consistency // 数据一致性校验相关的代码
├── deploy // 部署相关代码
├── external // Doris on Elasticsearch相关的代码
├── ha // 元数据高可用相关的代码
├── http // http v1 代码
├── httpv2 // http v2 代码(逐步替换v1)
├── journal // 元数据日志相关的代码
├── ldap // LDAP 认证相关代码
├── load // 导入作业相关代码
├── master // FE Master角色相关的操作代码,如元数据Checkpoint,BE任务汇报的处理等。
├── metric // FE 监控指标相关的代码
├── monitor // JVM 监控相关代码
├── mysql // MySQL协议层相关代码
├── PaloFe.java // Main函数入口
├── persist // 元数据持久化相关的代码
├── planner // 查询优化器相关的代码
├── plugin // Frontend端插件管理相关代码
├── qe // 用于处理各类SQL请求相关的代码。如查询请求的处理类、DDL请求的处理类等
├── resource // 资源标签相关的代码
├── rewrite // 查询优化器重写规则相关的代码
├── rpc // Frontend和Backend之间RPC协议相关的代码
├── service // Frontend侧各种服务器端代码
├── system // 集群节点的实例类和集群节点管理相关的代码
├── task // Frontend发往Backend的各类任务相关的代码
└── transaction // 导入事务相关代码
BE

be/

1
2
3
├── CMakeLists.txt // CMake 编译文件
├── src // 主代码目录
├── test // 单元测试

主代码目录包含:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
├── agent // FE 下发的 agent task 相关处理类
├── common // 通用类
├── env // 文件系统操作类
├── exec // 执行算子相关代码
├── exprs // 表达式、函数计算相关代码
├── geo // 地理位置函数相关代码
├── glibc-compatibility // GLIBC 兼容代码
├── gutil // Google gutil 相关代码
├── http // BE 端 http server 相关代码
├── olap // 存储层代码
├── plugin // BE 插件管理相关代码
├── runtime // 查询层运行时相关代码
├── service // BE 对外服务接口相关代码
├── testutil // 单元测试辅助类
├── tools // 辅助工具相关代码
├── udf // 用户自定义函数相关代码
└── util // 一些工具类
gensrc

gensrc/

1
2
3
4
├── Makefile
├── proto // protobuf 定义文件
├── script // 一些辅助脚本,包括函数定义代码生成模板等
└── thrift // thrift 定义文件

extension

extension/

1
2
3
4
├── DataX // DataX doriswriter 插件
├── flink-doris-connector // Flink Doris Connector
├── logstash // logstash 导入插件
└── spark-doris-connector // Spark Doris Connector

05  Apache Doris 代码合入准则



开发者在本地修改完代码后,需要完成以下几个步骤,方可提交代码:

  • 运行 run-fe-ut.sh  run-be-ut.sh 来运行单元测试并确认通过。

  • 提交 Pull Request

  • Pull Request 会触发准入测试:

    1.Travis CI/continuous-integration:文档编译准入。会对 docs/ 目录进行编译

    2.ut_build:单元测试准入。会运行 fe/be 单元测试。

    3.NewDorisTest:一个包含100多个 case 的最小回归测试集。

只有在以上准入测试都通过,并且有至少一个 Committer Approve 后,代码方可合入。


06  结语



以上就是本系列课程的开篇。希望能够帮助大家对 Doris 项目有个宏观的认识。



下 期 预 告


下期课程为《第 1 讲——建表语句的执行过程》,将围绕一个 Apache Doris 建表语句的具体执行过程帮助大家了解以下内容:
  • 用户请求的入口函数在哪里

  • 一个 DDL 语句是如何解析等

  • Doris 元数据的修改和持久化

  • 建表任务的创建以及 FE 与 BE 之间的任务交互过程

下期课程预计将于 9 月 29 日晚 19 点开始,课程时长约 30 分钟,届时我们将提前通过 ApacheDoris 微信公众号发出直播链接,欢迎大家持续关注。

如果各位小伙伴有其他想了解的模块,欢迎在微信公众号后台向我们留言,也可以点击文末阅读原文填写调查问卷,我们将会另行安排大家感兴趣的模块进行讲解。



【精彩文章】
活动预告|Apache Doris 源码阅读与解析系列直播深度解析|Apache Doris 索引机制解析最佳实践|Apache Doris Join 实现与调优实践
社区活动| Apache Doris 社区征文活动邀您参加~




欢迎扫码关注:

Apache Doris(incubating)官方公众号


相关链接:

Apache Doris官方网站:

http://doris.incubator.apache.org

Apache Doris Github:

https://github.com/apache/incubator-doris

Apache Doris 开发者邮件组:

dev@doris.apache.org 







您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存